<?php

require_once dirname(__FILE__).'/../lib/ins_atelierGeneratorConfiguration.class.php';
require_once dirname(__FILE__).'/../lib/ins_atelierGeneratorHelper.class.php';

/**
 * ins_atelier actions.
 *
 * @package    tfe
 * @subpackage ins_atelier
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class ins_atelierActions extends autoIns_atelierActions {

    // surcharge pour inscription rapide
    public function executeNew(sfWebRequest $request) {
        $id = $request->getParameter('id');
        if($id) {
            $ins = new InsAtelier();
            $ins->setIdContact($request->getParameter('id'));
            $this->form = new InsAtelierForm($ins);
        }else {
            $this->form = $this->configuration->getForm();
        }
        $this->ins_atelier = $this->form->getObject();
    }


    // surcharge de la methode processForm pour integrer le fait de ne pas dépasser le nombre
    // de personnes maximum
    // et pour éviter une inscription doublon
    protected function processForm(sfWebRequest $request, sfForm $form) {

        // recuperer le formulaire ['ins_atelier'] (code généré)
        $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));


        if( ! $form->getObject()->isNew()) {
            // le code qui suit est la méthode initiale générée
            if ($form->isValid()) {

                $notice = $form->getObject()->isNew() ? 'The item was created successfully.' : 'The item was updated successfully.';
                $ins_atelier = $form->save();
                $this->dispatcher->notify(new sfEvent($this, 'admin.save_object', array('object' => $ins_atelier)));

                if ($request->hasParameter('_save_and_add')) {
                    $this->getUser()->setFlash('notice', $notice.' You can add another one below.');
                    $this->redirect('@ins_atelier_new');
                }
                else {
                    $this->getUser()->setFlash('notice', $notice);
                    $this->redirect(array('sf_route' => 'ins_atelier_edit', 'sf_subject' => $ins_atelier));
                }
            }
            else {
                $this->getUser()->setFlash('error', 'The item has not been saved due to some errors.', false);
            }
        }else {
            // vérifier qu'il n'existe pas d'inscription pour la même personne / le même groupe cette année
            $existant = null;

            if($form->getValue('id_groupe') == null) {
                $existant = Doctrine_Query::create()
                        ->from('InsAtelier')
                        ->where('id_contact = ?', $form->getValue('id_contact'))
                        ->andWhere('id_atelier = ?', $form->getValue('id_atelier'))
                        ->andWhere('saison = ?', $form->getValue('saison'))
                        ->andWhere('deleted_at is null')
                        ->execute();
            }else {
                $existant = Doctrine_Query::create()
                        ->from('InsAtelier')
                        ->where('id_groupe = ?', $form->getValue('id_groupe'))
                        ->andWhere('id_atelier = ?', $form->getValue('id_atelier'))
                        ->andWhere("saison = ?", $form->getValue('saison'))
                        ->andWhere('deleted_at is null')
                        ->execute();
            }

            // si il y a une inscription existante, on le signale
            if(count($existant) != 0) {
                $this->getUser()->setFlash('error','Il y a déjà une inscription à ce nom cette année !',false);
            }else {

                // déterminer le nombre de nouvelles inscripitions si c'est un groupe
                $nb_inscriptions = 0;
                if($form->getValue('id_groupe') == null) {
                    $nb_inscriptions = 1;
                }else {
                    $groupe = Doctrine_Core::getTable('Groupe')->find($form->getValue('id_groupe'));
                    $nb_inscriptions = count($groupe->getMembres());
                }

                // recuperer l'atelier depuis l'id entre sur le formulaire
                $atelier = Doctrine_Core::getTable('Atelier')->find($form['id_atelier']->getValue('id_atelier'));
                // test pour voir si l'atelier a bien ete recupere
                if (!is_null($atelier) && !empty($atelier)) {
                    // si pas de nombre max, pas de vérification
                    $nb_pers_max  = $atelier->getNombreDePersonnesMax();
                    if($nb_pers_max != null) {
                        $inscriptions = $atelier->getInscriptions();
                        foreach($inscriptions as $ins) {
                            // ne prendre en compte que la saison demandée
                            if($ins->getSaison() == $form->getValue('saison')) {
                                // compter les membres du groupe si inscription groupée
                                if($ins->getIdGroupe() != null) {
                                    $nb_inscriptions += count($ins->getGroupe()->getMembres());
                                }else {
                                    $nb_inscriptions += 1;
                                }
                            }
                        }
                    }else {
                        // empêcher le blocage en cas d'absence de limite
                        $nb_pers_max = 9999;
                    }

                    if($nb_inscriptions > $nb_pers_max) {
                        $this->getUser()->setFlash('error', 'L\'atelier '. $atelier .' est complet ! (maximum : '. $atelier->getNombreDePersonnesMax() .' personnes)', false);
                    }else {
                        // le code qui suit est la méthode initiale générée
                        if ($form->isValid()) {

                            $notice = $form->getObject()->isNew() ? 'The item was created successfully.' : 'The item was updated successfully.';
                            $ins_atelier = $form->save();
                            $this->dispatcher->notify(new sfEvent($this, 'admin.save_object', array('object' => $ins_atelier)));

                            if ($request->hasParameter('_save_and_add')) {
                                $this->getUser()->setFlash('notice', $notice.' You can add another one below.');
                                $this->redirect('@ins_atelier_new');
                            }
                            else {
                                $this->getUser()->setFlash('notice', $notice);
                                $this->redirect(array('sf_route' => 'ins_atelier_edit', 'sf_subject' => $ins_atelier));
                            }
                        }
                        else {
                            $this->getUser()->setFlash('error', 'The item has not been saved due to some errors.', false);
                        }
                    }
                }
            }
        }
    }

    // utile pour que les actions batch respectent le softDelete
    protected function executeBatchDelete(sfWebRequest $request) {
        $ids = $request->getParameter('ids');

        $records = Doctrine_Query::create()
                ->select()
                ->from('InsAtelier')
                ->whereIn('id', $ids)
                ->execute();

        $count = 0;
        foreach($records as $record) {
            $count += $record->delete();
        }

        if ($count >= count($ids)) {
            $this->getUser()->setFlash('notice', 'The selected items have been deleted successfully.');
        }
        else {
            $this->getUser()->setFlash('error', 'A problem occurs when deleting the selected items.');
        }

        $this->redirect('@ins_atelier');
    }

}
